package mx.itesm.goyostacoadventure;

import org.andengine.entity.scene.background.AutoParallaxBackground;
import org.andengine.entity.scene.background.ParallaxBackground;
import org.andengine.entity.scene.menu.MenuScene;
import org.andengine.entity.scene.menu.item.IMenuItem;
import org.andengine.entity.scene.menu.item.SpriteMenuItem;
import org.andengine.entity.scene.menu.item.decorator.ScaleMenuItemDecorator;
import org.andengine.entity.sprite.Sprite;

/**
* La escena que se muestra cuando corre la aplicación (Logo del TEC)
*/
public class EscenaMenu extends EscenaBase {

    //variables para fondo animado
    private Sprite fondoFijo;
    private Sprite fondoNubes;
    private Sprite fondoEdificios;
    private Sprite fondoPasto;
    private Sprite fondoLejos;
    private Sprite fondoCerca;
    private Sprite fondoLogo;
    AutoParallaxBackground fondo;

    // *** Un menú de tipo SceneMenu
    private MenuScene menu;     // Reemplaza a los botones individuales
    private final int OPCION_ACERCA_DE = 0;
    private final int OPCION_JUGAR = 1;
    private final int OPCION_TUTORIALES = 2;

    //Musica
    private AdministradorSonidos admSonidos = AdministradorSonidos.getInstance();

    @Override
    public void crearEscena() {

        //Fondo animado
        fondoAnimado();

        //OTRA FORMA DE MOSTRAR OPCIONES DE MENÚ
        agregarMenu();

    }

    //Fondo animado
    private void fondoAnimado() {
        float x = ControlJuego.ANCHO_CAMARA / 2;
        float xLargo = admRecursos.regionFondoEdificios.getWidth() / 2;

        float y = ControlJuego.ALTO_CAMARA / 2;

        fondoFijo = new Sprite(x, y, admRecursos.regionFondoFijo, admRecursos.vbom);
        fondoNubes = new Sprite(xLargo, y, admRecursos.regionFondoNubes, admRecursos.vbom);
        fondoEdificios = new Sprite(xLargo, y, admRecursos.regionFondoEdificios, admRecursos.vbom);
        fondoPasto = new Sprite(x, y, admRecursos.regionFondoPasto, admRecursos.vbom);
        fondoLejos = new Sprite(xLargo, y, admRecursos.regionFondoLejos, admRecursos.vbom);
        fondoCerca = new Sprite(xLargo, y, admRecursos.regionFondoCerca, admRecursos.vbom);
        fondoLogo = new Sprite(x, y, admRecursos.regionFondoLogo, admRecursos.vbom);

        fondo = new AutoParallaxBackground(0, 0, 0, 10);
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(0, fondoFijo));
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(-1, fondoNubes));
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(-3, fondoEdificios));
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(0, fondoPasto));
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(-4, fondoLejos));
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(-5, fondoCerca));
        fondo.attachParallaxEntity(new ParallaxBackground.ParallaxEntity(0, fondoLogo));


        setBackground(fondo);
        setBackgroundEnabled(true);
    }


    private void agregarMenu() {
        // Crea el objeto que representa el menú
        menu = new MenuScene(admRecursos.camara);
        // Centrado en la pantalla
        menu.setPosition(ControlJuego.ANCHO_CAMARA / 2, ControlJuego.ALTO_CAMARA / 2);
        // Crea las opciones (por ahora, acerca de y jugar)
        final IMenuItem opcionAcercaDe = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_ACERCA_DE,
                admRecursos.regionBotonAcercaDe, admRecursos.vbom), 1.5f, 1);
        final IMenuItem opcionJugar = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_JUGAR,
                admRecursos.regionBotonJugar, admRecursos.vbom), 1.1f, 1);
        final IMenuItem opcionTutoriales = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_TUTORIALES,
                admRecursos.regionBotonTutoriales, admRecursos.vbom),1.5f,1);
        // Agrega las opciones al menú
        menu.addMenuItem(opcionAcercaDe);
        menu.addMenuItem(opcionJugar);
        menu.addMenuItem(opcionTutoriales);
        // Termina la configuración
        menu.buildAnimations();
        menu.setBackgroundEnabled(false);
        // Ubicar las opciones DENTRO del menú. El centro del menú es (0,0)
        opcionAcercaDe.setPosition(-339, 203);
        opcionJugar.setPosition(18, -156);
        opcionTutoriales.setPosition(-339,123);
        // Registra el Listener para atender las opciones
        menu.setOnMenuItemClickListener(new MenuScene.IOnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem,
                                             float pMenuItemLocalX, float pMenuItemLocalY) {
                // El parámetro pMenuItem indica la opcion oprimida
                switch (pMenuItem.getID()) {
                    case OPCION_ACERCA_DE:
                        // Mostrar la escena de AcercaDe
                        admSonidos.btnir.play();
                        admSonidos.cargarMusicaTienda();
                        admSonidos.pararMusica();
                        admSonidos.setMusicaBase(TipoMusica.MUSICA_TIENDA);
                        admSonidos.liberarMusicaPantallas();
                        admEscenas.crearEscenaAcercaDe();
                        admEscenas.setEscena(TipoEscena.ESCENA_ACERCA_DE);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_JUGAR:
                        // Mostrar la pantalla de juego
                        admSonidos.cargarSonidosJuego();
                        admSonidos.btnir.play();
                        admSonidos.cargarMusicaJuego();
                        admSonidos.pararMusica();
                        admSonidos.setMusicaBase(TipoMusica.MUSICA_JUEGO);
                        admSonidos.liberarMusicaPantallas();
                        admEscenas.crearEscenaJuego();
                        admEscenas.setEscena(TipoEscena.ESCENA_JUEGO);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_TUTORIALES:
                        admSonidos.btnir.play();
                        admEscenas.crearEscenaTutoriales();
                        admEscenas.setEscena(TipoEscena.ESCENA_TUTORIALES);
                        admEscenas.liberarEscenaMenu();
                        break;
                    default:
                        return false;
                }
                return true;
            }
        });

        // Asigna este menú a la escena
        setChildScene(menu);
    }

    @Override
    public void onBackKeyPressed() {
        admSonidos.pararMusica();
    }

    @Override
    public TipoEscena getTipoEscena() {
        return TipoEscena.ESCENA_MENU;
    }

    @Override
    public void liberarEscena() {
        // Menu
        menu.detachSelf();
        menu.dispose();
        //Se desconecta la escena y libera memoria
        this.detachSelf();      // La escena se deconecta del engine
        this.dispose();         // Libera la memoria

    }
}
